Interactive Data Visualization Frameworks

There are various ways to create interactive visualizations. We present two very popular packages, that adapt ggplots syntax, making them very comfortable to use.

charts

plotly

Ther are two ways to make use of plotlys framework.

ggplotly & plotly for R ggplotly turns your ggplot graphs with the function ggplotly() into an interactive graph.

plotly uses a different syntax style, but provides more interactive capabilities

library(plotly)
library(broom)
library(dplyr)
data(diamonds, package = "ggplot2")

data <- sample_n(diamonds, 300)

modlss <- loess(price ~ carat, data = data)
fit <- arrange(augment(modlss,se_fit = TRUE), carat)

p <- ggplot(NULL, mapping = aes(x = carat, y = price )) +
              geom_ribbon(data  = fit, mapping = aes(ymin = .fitted - 2*.se.fit, ymax = .fitted + 2*.se.fit), fill = "grey70")+
              geom_point(data = data, alpha = 0.7, mapping = aes(size = depth, group = cut, color = cut)) +
              geom_line(data = fit, aes(x = carat, y = .fitted)) 
  


ggplotly(p)

highcharter

The main difference in ggplot2’s geom_ functions and hc_add_series is that we need to add data and aesthetics explicitly in every function while in ggplot2 one can add data and aesthetics in a layer and then can further add more geoms which can work on same data and aesthetics.

An accurate example is given below using the diamond dataset in the ggplot2 package.

library(highcharter)
library(broom)
library(dplyr)
data(diamonds, package = "ggplot2")

data <- sample_n(diamonds, 300)

modlss <- loess(price ~ carat, data = data)
fit <- arrange(augment(modlss,se_fit = TRUE), carat)

highchart() %>%
  hc_add_series(data, type = "scatter",
                hcaes(x = carat, y = price, size = depth, group = cut)) %>%
  hc_add_series(fit, type = "line", hcaes(x = carat, y = .fitted),
                name = "Fit", id = "fit") %>%
  hc_add_series(fit, type = "arearange",
                hcaes(x = carat, low = .fitted - 2*.se.fit,
                      high = .fitted + 2*.se.fit),
                linkedTo = "fit")

plot_ly

The main difference in ggplot2’s geom_ functions and hc_add_series is that we need to add data and aesthetics explicitly in every function while in ggplot2 one can add data and aesthetics in a layer and then can further add more geoms which can work on same data and aesthetics.

An accurate example is given below using the diamond dataset in the ggplot2 package.

library(plotly)
library(broom)
library(dplyr)
data(diamonds, package = "ggplot2")

data <- sample_n(diamonds, 300)

modlss <- loess(price ~ carat, data = data)
fit <- augment(modlss, se_fit = TRUE)


fig <- plot_ly(data = data, x = ~carat) %>% 
  add_markers(y = ~price, 
              color = ~cut, 
              size = ~carat, 
              text = ~paste("Price: ", price, '$<br>Cut:', cut)) %>%
  add_lines(y = ~fitted(loess(price ~ carat)),
                         line = list(color = 'lightblue'),
                         name = "Loess Smoother") %>%
  add_ribbons(data = augment(loess(price ~ carat,data = data),se_fit = TRUE), 
              ymin = ~.fitted - 2 * .se.fit,
              ymax = ~.fitted + 2 * .se.fit,
              line = list(color = "rgba(2, 162, 182, 0.05)"),
              fillcolor = "rgba(2, 162, 182, 0.2)",
              name = "Standarderror"
              )


fig
# highchart() %>%
#   hc_add_series(data, type = "scatter",
#                 hcaes(x = carat, y = price, size = depth, group = cut)) %>%
#   hc_add_series(fit, type = "line", hcaes(x = carat, y = .fitted),
#                 name = "Fit", id = "fit") %>%
#   hc_add_series(fit, type = "arearange",
#                 hcaes(x = carat, low = .fitted - 2*.se.fit,
#                       high = .fitted + 2*.se.fit),
#                 linkedTo = "fit")

Data tables

Exercise 1.

  1. delete or comment out the 4th line of this code chunk. What difference does this make in terms of computation and usability? What’s going on here?
library(DT)
## Warning: package 'DT' was built under R version 4.1.2
data(diamonds, package = "ggplot2") # load data 

data <- diamonds[sample(nrow(diamonds), 300),1:5] #create a subset of the dataset

datatable(data, filter = 'top',  
          options = list(   searchHighlight = TRUE, pageLength = 15 ))

Slides

Using ioslides we can also implement interactive plots in our presentations!

---
title: Do Natural Disasters Stimulate Environmental Attitudes? Evidence from a Natural
  Experiment.
author: "Hamid Bulut"
date: "27/4/2022"
output:
  ioslides_presentation:
    css: www/styles.css
    widescreen: yes
    smaller: yes
    highlight: monochrome
  slidy_presentation:
    highlight: monochrome
  beamer_presentation:
    highlight: monochrome
subtitle: A Regression Discontinuity Design Analysis
editor_options:
  markdown:
    wrap: 72
---
knitr::include_url("index_files/slides/slides1.html", height = "800px")
LS0tDQp0aXRsZTogIkludGVyYWN0aXZpdHkiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB5ZXMNCiAgICB0aGVtZTogbHVtZW4gDQogICAgI251bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgI2Nzczogc2xpZGVzL3d3dy9zdHlsZS5jc3MNCiAgaHRtbF9ub3RlYm9vazoNCiAgIHRvYzogeWVzDQogICB0aGVtZTogbHVtZW4gDQogICAjbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgdG9jX2RlcHRoOiAzDQogICB0b2NfZmxvYXQ6IHllcw0KZWRpdG9yX29wdGlvbnM6DQogIG1hcmtkb3duOg0KICAgIHdyYXA6IDE0MA0KLS0tDQoNCg0KIyBJbnRlcmFjdGl2ZSBEYXRhIFZpc3VhbGl6YXRpb24gRnJhbWV3b3Jrcw0KVGhlcmUgYXJlIHZhcmlvdXMgd2F5cyB0byBjcmVhdGUgaW50ZXJhY3RpdmUgdmlzdWFsaXphdGlvbnMuIFdlIHByZXNlbnQgdHdvIHZlcnkgcG9wdWxhciBwYWNrYWdlcywgdGhhdCBhZGFwdCBnZ3Bsb3RzIHN5bnRheCwgbWFraW5nIHRoZW0gdmVyeSBjb21mb3J0YWJsZSB0byB1c2UuIA0KDQojIyBjaGFydHMgey50YWJzZXQgLnRhYnNldC1waWxsc30NCiMjIyBwbG90bHkNCg0KVGhlciBhcmUgdHdvIHdheXMgdG8gbWFrZSB1c2Ugb2YgcGxvdGx5cyBmcmFtZXdvcmsuICANCg0KW2dncGxvdGx5XShodHRwczovL3Bsb3RseS5jb20vZ2dwbG90Mi8pICYgW3Bsb3RseSBmb3IgUl0oaHR0cHM6Ly9wbG90bHkuY29tL3IvKQ0KZ2dwbG90bHkgdHVybnMgeW91ciBnZ3Bsb3QgZ3JhcGhzIHdpdGggdGhlIGZ1bmN0aW9uICpnZ3Bsb3RseSgpKiBpbnRvIGFuIGludGVyYWN0aXZlIGdyYXBoLiANCg0KcGxvdGx5IHVzZXMgYSBkaWZmZXJlbnQgc3ludGF4IHN0eWxlLCBidXQgcHJvdmlkZXMgbW9yZSBpbnRlcmFjdGl2ZSBjYXBhYmlsaXRpZXMNCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBzaXplPSAiMTAwJSJ9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGRwbHlyKQ0KZGF0YShkaWFtb25kcywgcGFja2FnZSA9ICJnZ3Bsb3QyIikNCg0KZGF0YSA8LSBzYW1wbGVfbihkaWFtb25kcywgMzAwKQ0KDQptb2Rsc3MgPC0gbG9lc3MocHJpY2UgfiBjYXJhdCwgZGF0YSA9IGRhdGEpDQpmaXQgPC0gYXJyYW5nZShhdWdtZW50KG1vZGxzcyxzZV9maXQgPSBUUlVFKSwgY2FyYXQpDQoNCnAgPC0gZ2dwbG90KE5VTEwsIG1hcHBpbmcgPSBhZXMoeCA9IGNhcmF0LCB5ID0gcHJpY2UgKSkgKw0KICAgICAgICAgICAgICBnZW9tX3JpYmJvbihkYXRhICA9IGZpdCwgbWFwcGluZyA9IGFlcyh5bWluID0gLmZpdHRlZCAtIDIqLnNlLmZpdCwgeW1heCA9IC5maXR0ZWQgKyAyKi5zZS5maXQpLCBmaWxsID0gImdyZXk3MCIpKw0KICAgICAgICAgICAgICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhLCBhbHBoYSA9IDAuNywgbWFwcGluZyA9IGFlcyhzaXplID0gZGVwdGgsIGdyb3VwID0gY3V0LCBjb2xvciA9IGN1dCkpICsNCiAgICAgICAgICAgICAgZ2VvbV9saW5lKGRhdGEgPSBmaXQsIGFlcyh4ID0gY2FyYXQsIHkgPSAuZml0dGVkKSkgDQogIA0KDQoNCmdncGxvdGx5KHApDQpgYGANCg0KIA0KIyMjIGhpZ2hjaGFydGVyIA0KDQpUaGUgbWFpbiBkaWZmZXJlbmNlIGluIGdncGxvdDIncyBnZW9tXyBmdW5jdGlvbnMgYW5kIGhjX2FkZF9zZXJpZXMgaXMgdGhhdCB3ZSBuZWVkIHRvIGFkZCBkYXRhIGFuZCBhZXN0aGV0aWNzIGV4cGxpY2l0bHkgaW4gZXZlcnkgZnVuY3Rpb24gd2hpbGUgaW4gZ2dwbG90MiBvbmUgY2FuIGFkZCBkYXRhIGFuZCBhZXN0aGV0aWNzIGluIGEgbGF5ZXIgYW5kIHRoZW4gY2FuIGZ1cnRoZXIgYWRkIG1vcmUgZ2VvbXMgd2hpY2ggY2FuIHdvcmsgb24gc2FtZSBkYXRhIGFuZCBhZXN0aGV0aWNzLg0KDQpBbiBhY2N1cmF0ZSBleGFtcGxlIGlzIGdpdmVuIGJlbG93IHVzaW5nIHRoZSBkaWFtb25kIGRhdGFzZXQgaW4gdGhlIGdncGxvdDIgcGFja2FnZS4NCg0KYGBge3IgZWNobz1UUlVFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0NCmxpYnJhcnkoaGlnaGNoYXJ0ZXIpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShkcGx5cikNCmRhdGEoZGlhbW9uZHMsIHBhY2thZ2UgPSAiZ2dwbG90MiIpDQoNCmRhdGEgPC0gc2FtcGxlX24oZGlhbW9uZHMsIDMwMCkNCg0KbW9kbHNzIDwtIGxvZXNzKHByaWNlIH4gY2FyYXQsIGRhdGEgPSBkYXRhKQ0KZml0IDwtIGFycmFuZ2UoYXVnbWVudChtb2Rsc3Msc2VfZml0ID0gVFJVRSksIGNhcmF0KQ0KDQpoaWdoY2hhcnQoKSAlPiUNCiAgaGNfYWRkX3NlcmllcyhkYXRhLCB0eXBlID0gInNjYXR0ZXIiLA0KICAgICAgICAgICAgICAgIGhjYWVzKHggPSBjYXJhdCwgeSA9IHByaWNlLCBzaXplID0gZGVwdGgsIGdyb3VwID0gY3V0KSkgJT4lDQogIGhjX2FkZF9zZXJpZXMoZml0LCB0eXBlID0gImxpbmUiLCBoY2Flcyh4ID0gY2FyYXQsIHkgPSAuZml0dGVkKSwNCiAgICAgICAgICAgICAgICBuYW1lID0gIkZpdCIsIGlkID0gImZpdCIpICU+JQ0KICBoY19hZGRfc2VyaWVzKGZpdCwgdHlwZSA9ICJhcmVhcmFuZ2UiLA0KICAgICAgICAgICAgICAgIGhjYWVzKHggPSBjYXJhdCwgbG93ID0gLmZpdHRlZCAtIDIqLnNlLmZpdCwNCiAgICAgICAgICAgICAgICAgICAgICBoaWdoID0gLmZpdHRlZCArIDIqLnNlLmZpdCksDQogICAgICAgICAgICAgICAgbGlua2VkVG8gPSAiZml0IikNCmBgYA0KDQojIyMgcGxvdF9seSANCg0KVGhlIG1haW4gZGlmZmVyZW5jZSBpbiBnZ3Bsb3QyJ3MgZ2VvbV8gZnVuY3Rpb25zIGFuZCBoY19hZGRfc2VyaWVzIGlzIHRoYXQgd2UgbmVlZCB0byBhZGQgZGF0YSBhbmQgYWVzdGhldGljcyBleHBsaWNpdGx5IGluIGV2ZXJ5IGZ1bmN0aW9uIHdoaWxlIGluIGdncGxvdDIgb25lIGNhbiBhZGQgZGF0YSBhbmQgYWVzdGhldGljcyBpbiBhIGxheWVyIGFuZCB0aGVuIGNhbiBmdXJ0aGVyIGFkZCBtb3JlIGdlb21zIHdoaWNoIGNhbiB3b3JrIG9uIHNhbWUgZGF0YSBhbmQgYWVzdGhldGljcy4NCg0KQW4gYWNjdXJhdGUgZXhhbXBsZSBpcyBnaXZlbiBiZWxvdyB1c2luZyB0aGUgZGlhbW9uZCBkYXRhc2V0IGluIHRoZSBnZ3Bsb3QyIHBhY2thZ2UuDQoNCmBgYHtyIGVjaG89VFJVRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkoYnJvb20pDQpsaWJyYXJ5KGRwbHlyKQ0KZGF0YShkaWFtb25kcywgcGFja2FnZSA9ICJnZ3Bsb3QyIikNCg0KZGF0YSA8LSBzYW1wbGVfbihkaWFtb25kcywgMzAwKQ0KDQptb2Rsc3MgPC0gbG9lc3MocHJpY2UgfiBjYXJhdCwgZGF0YSA9IGRhdGEpDQpmaXQgPC0gYXVnbWVudChtb2Rsc3MsIHNlX2ZpdCA9IFRSVUUpDQoNCg0KZmlnIDwtIHBsb3RfbHkoZGF0YSA9IGRhdGEsIHggPSB+Y2FyYXQpICU+JSANCiAgYWRkX21hcmtlcnMoeSA9IH5wcmljZSwgDQogICAgICAgICAgICAgIGNvbG9yID0gfmN1dCwgDQogICAgICAgICAgICAgIHNpemUgPSB+Y2FyYXQsIA0KICAgICAgICAgICAgICB0ZXh0ID0gfnBhc3RlKCJQcmljZTogIiwgcHJpY2UsICckPGJyPkN1dDonLCBjdXQpKSAlPiUNCiAgYWRkX2xpbmVzKHkgPSB+Zml0dGVkKGxvZXNzKHByaWNlIH4gY2FyYXQpKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICdsaWdodGJsdWUnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIkxvZXNzIFNtb290aGVyIikgJT4lDQogIGFkZF9yaWJib25zKGRhdGEgPSBhdWdtZW50KGxvZXNzKHByaWNlIH4gY2FyYXQsZGF0YSA9IGRhdGEpLHNlX2ZpdCA9IFRSVUUpLCANCiAgICAgICAgICAgICAgeW1pbiA9IH4uZml0dGVkIC0gMiAqIC5zZS5maXQsDQogICAgICAgICAgICAgIHltYXggPSB+LmZpdHRlZCArIDIgKiAuc2UuZml0LA0KICAgICAgICAgICAgICBsaW5lID0gbGlzdChjb2xvciA9ICJyZ2JhKDIsIDE2MiwgMTgyLCAwLjA1KSIpLA0KICAgICAgICAgICAgICBmaWxsY29sb3IgPSAicmdiYSgyLCAxNjIsIDE4MiwgMC4yKSIsDQogICAgICAgICAgICAgIG5hbWUgPSAiU3RhbmRhcmRlcnJvciINCiAgICAgICAgICAgICAgKQ0KDQoNCmZpZw0KDQojIGhpZ2hjaGFydCgpICU+JQ0KIyAgIGhjX2FkZF9zZXJpZXMoZGF0YSwgdHlwZSA9ICJzY2F0dGVyIiwNCiMgICAgICAgICAgICAgICAgIGhjYWVzKHggPSBjYXJhdCwgeSA9IHByaWNlLCBzaXplID0gZGVwdGgsIGdyb3VwID0gY3V0KSkgJT4lDQojICAgaGNfYWRkX3NlcmllcyhmaXQsIHR5cGUgPSAibGluZSIsIGhjYWVzKHggPSBjYXJhdCwgeSA9IC5maXR0ZWQpLA0KIyAgICAgICAgICAgICAgICAgbmFtZSA9ICJGaXQiLCBpZCA9ICJmaXQiKSAlPiUNCiMgICBoY19hZGRfc2VyaWVzKGZpdCwgdHlwZSA9ICJhcmVhcmFuZ2UiLA0KIyAgICAgICAgICAgICAgICAgaGNhZXMoeCA9IGNhcmF0LCBsb3cgPSAuZml0dGVkIC0gMiouc2UuZml0LA0KIyAgICAgICAgICAgICAgICAgICAgICAgaGlnaCA9IC5maXR0ZWQgKyAyKi5zZS5maXQpLA0KIyAgICAgICAgICAgICAgICAgbGlua2VkVG8gPSAiZml0IikNCmBgYA0KDQoNCiMjIERhdGEgdGFibGVzDQoNCkV4ZXJjaXNlIDEuIA0KDQoxLiBkZWxldGUgb3IgY29tbWVudCBvdXQgdGhlIDR0aCBsaW5lIG9mIHRoaXMgY29kZSBjaHVuay4NCldoYXQgZGlmZmVyZW5jZSBkb2VzIHRoaXMgbWFrZSBpbiB0ZXJtcyBvZiBjb21wdXRhdGlvbiBhbmQgdXNhYmlsaXR5PyANCldoYXQncyBnb2luZyBvbiBoZXJlPw0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpkYXRhKGRpYW1vbmRzLCBwYWNrYWdlID0gImdncGxvdDIiKSAjIGxvYWQgZGF0YSANCg0KZGF0YSA8LSBkaWFtb25kc1tzYW1wbGUobnJvdyhkaWFtb25kcyksIDMwMCksMTo1XSAjY3JlYXRlIGEgc3Vic2V0IG9mIHRoZSBkYXRhc2V0DQoNCmRhdGF0YWJsZShkYXRhLCBmaWx0ZXIgPSAndG9wJywgIA0KICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KCAgIHNlYXJjaEhpZ2hsaWdodCA9IFRSVUUsIHBhZ2VMZW5ndGggPSAxNSApKQ0KDQpgYGANCiMjIFNsaWRlcyANCg0KVXNpbmcgaW9zbGlkZXMgd2UgY2FuIGFsc28gaW1wbGVtZW50IGludGVyYWN0aXZlIHBsb3RzIGluIG91ciBwcmVzZW50YXRpb25zISANCg0KYGBge3IgZXZhbCA9IEZBTFNFfQ0KLS0tDQp0aXRsZTogRG8gTmF0dXJhbCBEaXNhc3RlcnMgU3RpbXVsYXRlIEVudmlyb25tZW50YWwgQXR0aXR1ZGVzPyBFdmlkZW5jZSBmcm9tIGEgTmF0dXJhbA0KICBFeHBlcmltZW50Lg0KYXV0aG9yOiAiSGFtaWQgQnVsdXQiDQpkYXRlOiAiMjcvNC8yMDIyIg0Kb3V0cHV0Og0KICBpb3NsaWRlc19wcmVzZW50YXRpb246DQogICAgY3NzOiB3d3cvc3R5bGVzLmNzcw0KICAgIHdpZGVzY3JlZW46IHllcw0KICAgIHNtYWxsZXI6IHllcw0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KICBzbGlkeV9wcmVzZW50YXRpb246DQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQogIGJlYW1lcl9wcmVzZW50YXRpb246DQogICAgaGlnaGxpZ2h0OiBtb25vY2hyb21lDQpzdWJ0aXRsZTogQSBSZWdyZXNzaW9uIERpc2NvbnRpbnVpdHkgRGVzaWduIEFuYWx5c2lzDQplZGl0b3Jfb3B0aW9uczoNCiAgbWFya2Rvd246DQogICAgd3JhcDogNzINCi0tLQ0KYGBgDQoNCg0KYGBge3IsIG91dC53aWR0aD0xMTAwLCBvdXQuZXh0cmE9J3N0eWxlPSJib3JkZXI6IDFweCBzb2xpZCAjNDY0NjQ2OyIgYWxsb3dmdWxsc2NyZWVuPSIiIGFsbG93PSJhdXRvcGxheSInfQ0Ka25pdHI6OmluY2x1ZGVfdXJsKCJpbmRleF9maWxlcy9zbGlkZXMvc2xpZGVzMS5odG1sIiwgaGVpZ2h0ID0gIjgwMHB4IikNCmBgYA0KDQo=